#region Microsoft Public License
/*
 * (c) Copyright Chenjun Wu. http://utablesdk.codeplex.com
 * 
 * This source is subject to the Microsoft Public License (Ms-PL).
 * Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.
 * All other rights reserved.
 */
#endregion

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using UTable.Input;
using UTable.Input.MultiTouch;
using UTable.Input.Text;
using UTable.Objects.Handlers;

namespace UTable.Objects.Controls
{
	public class URichTextBox: RichTextBox, IControl
	{

        #region Constructors

        static URichTextBox()
        {
            // DefaultStyleKeyProperty.OverrideMetadata(typeof(UTextBox), new FrameworkPropertyMetadata(typeof(UTextBox)));
        }

		public URichTextBox()
        {
            InitializeIControlPart();
            OneFingerHandler handler = new OneFingerHandler();
            handler.OneFingerDown += new FingersDownEventHandler(handler_OneFingerDown);
            handler.OneFingerUp += new FingersUpEventHandler(handler_OneFingerUp);
            handler.OneFingerMove += new FingersMoveEventHandler(handler_OneFingerMove);
            MultiTouchProcessor.Handlers.Add(handler);
            this.InputReceived += new InputEventHandler(UTextBox_InputReceived);
        }

        void UTextBox_InputReceived(InputEventArgs args)
        {
            if (args is TextInputEventArgs)
            {
                TextInputEventArgs textArgs = args as TextInputEventArgs;

				// use the RichTextBox.OnTextInput for simplifying

				/*
                if (textArgs.ControlCommand != ControlCommand.None)
                {
                    switch (textArgs.ControlCommand)
                    {
                        case ControlCommand.Back:
                            if (this.Text.Length > 0)
                                this.Text = this.Text.Remove(this.Text.Length - 1);
                            break;
                        case ControlCommand.Clear:
                            this.Text = "";
                            break;
                    }
                    return;
                }
                if (textArgs.Text != "")
                {
                    this.Text += textArgs.Text;
                    return;
                }*/

            }
            args.Handled = true;
        }

        #endregion

        #region MultiTouch Process Part

        void handler_OneFingerUp(List<FingerPoint> fingers)
        {
            Point p = fingers[0].Position;
            if (p.X >= 0 && p.X <= this.Width && p.Y >= 0 && p.Y <= this.Height)
            {
                UTableHelper.TextInputManager.RequestTextInput(this);
            }
        }

        void handler_OneFingerDown(List<FingerPoint> fingers)
        {

        }

        void handler_OneFingerMove(List<FingerPoint> oFigners, List<FingerPoint> nFingers)
        {
        }

        #endregion


		#region IControl Implementation
		
		#region Private Fields

        private ControlBaseImpl _impl;

        #endregion

		#region Private Methods

		private void InitializeIControlPart()
        {
			_impl = new ControlBaseImpl(this);
            _impl.GotFingerCapture += new UTable.Input.MultiTouch.FingerEventHandler(_impl_GotFingerCapture);
            _impl.LostFingerCapture += new UTable.Input.MultiTouch.FingerEventHandler(_impl_LostFingerCapture);
			this.InputReceived += new UTable.Input.InputEventHandler(_impl_InputReceived);
        }

        void _impl_InputReceived(UTable.Input.InputEventArgs args)
        {
			if (args is UTable.Input.MultiTouch.MultiTouchEventArgs)
				MultiTouchProcessor.RaiseMultiTouchEvent(args as UTable.Input.MultiTouch.MultiTouchEventArgs);
        }

        void _impl_LostFingerCapture(object sender, UTable.Input.MultiTouch.FingerEventArgs args)
        {
            if (LostFingerCapture != null)
                LostFingerCapture(sender, args);
        }

        void _impl_GotFingerCapture(object sender, UTable.Input.MultiTouch.FingerEventArgs args)
        {
            if (GotFingerCapture != null)
                GotFingerCapture(sender, args);
        }

        #endregion

        #region IControl Members

        public UTable.Objects.Controls.ControlInfo Info
        {
            get { return _impl.Info; }
        }
		
		public UTable.Objects.Handlers.MultiTouchProcessor MultiTouchProcessor 
		{ 
			get { return _impl.MultiTouchProcessor; } 
		}

        #endregion

        #region IVisualNode Members

        public String ID
        {
            get { return _impl.ID; }
        }

        public new double Width
        {
            get { return _impl.Width; }
            set { _impl.Width = value; }
        }

        public new double Height
        {
            get { return _impl.Height; }
            set { _impl.Height = value; }
        }

        public new bool IsHitTestVisible
        {
            get { return _impl.IsHitTestVisible; }
            set { _impl.IsHitTestVisible = value; }
        }

        #endregion

        #region IInputNode Members

        public void RaiseEvent(UTable.Input.InputEventArgs e)
        {
            if (InputReceived != null)
            {
                InputReceived(e);
            }
            OnInputReceived(e);
        }

        public virtual void OnInputReceived(UTable.Input.InputEventArgs args)
        {
            _impl.OnInputReceived(args);
        }

        public bool CaptureFinger(int fingerId)
        {
            return _impl.CaptureFinger(fingerId);
        }

        public bool UncaptureFinger(int fingerId)
        {
            return _impl.UncaptureFinger(fingerId);
        }

        public event UTable.Input.MultiTouch.FingerEventHandler GotFingerCapture;

        public event UTable.Input.MultiTouch.FingerEventHandler LostFingerCapture;

        public event UTable.Input.InputEventHandler InputReceived;

        #endregion
        #endregion
	}
}
